Laurea in Ingegneria Gestionale, Corso di

Progettazione del Software

Edizione dell'a.a. 2007/08

Materiale di autovalutazione AUTOV.Java.2 - Esercizi

Questa sezione è costituita da due parti.

La parte "Domande" ha la funzione di aiutare lo studente nell'autovalutazione e nell'individuazione degli argomenti che gli sono poco chiari. Le soluzioni non verranno fornite in classe. Il docente rimane comunque a disposizione per eventuali dubbi. Si fa notare che il modo migliore per le domande che riguardano linee di codice è quello di scrivere un breve programma di prova e compilarlo...

La parte "Esercizi di programmazione" contiene alcuni esercizi che gli studenti sono invitati a svolgere. Le soluzioni di alcuni di essi non verranno pubblicate, in quanto la verifica della loro correttezza può essere effettuata dagli stessi studenti scrivendo brevi moduli cliente.

Domande

  1. Come si dichiara un array di array di array di int?
  2. Trovare gli errori nel seguente frammento di codice:
    int[][] array=new int[5][6];
    for(int i=0;i<=array.length;i++){
      for(int j=0;j<=array[j].length;j++){
    	System.out.println(array[i][j]);
      }
    }
    
  3. Quale configurazione dello heap e dello stack produce il seguente frammento di codice?
    int[][][] a=new int[][][]{{{1}}};
    	
  4. Disegnare l'evoluzione di heap e stack durante l'esecuzione delle istruzioni
    int[][] a=new int[4][4];
    a[3]=new int[2];
    b=a;
    a=a[2];
    
  5. A che serve la keyword "void"?
  6. Determinare cosa fa il seguente programma e disegnare l'evoluzione dello stack (i record di attivazione) durante l'esecuzione.
    public static void main(String Args[]){
    	int a=5;
    	if(cambia(a)) {
    		System.out.println("questo lo stampo?");
    	}
    	if(cambia(a)) {
    		System.out.println(" e questo?");
    	}
    }
    
    static boolean cambia(int a){
    	a++;
    	if(a % 2 == 0) return true;
    	return false;
    }
    
  7. Cosa fa la seguente funzione quando viene invocata con l'istruzione stampa(0)?
    public static void stampa(int a){
    	if(a > 10) return;
    	stampa(a+1);
    	System.out.println(a);
    }
    
  8. Disegnare l'evoluzione dello stack (record di attivazione) per la seguente chiamata della funzione definita nell'esercizio precedente: stampa(8).

Esercizi di programmazione

Scrivere, compilare ed eseguire un programma Java che...
  1. ...data una lista di valori interi, trova il massimo valore.
  2. ...data una lista di valori interi, crea una lista che contiene gli stessi valori, ma senza duplicati.
  3. ...stampa i primi 100 numeri primi in ordine inverso.
  4. ...data una lista di valori interi (lunga a piacere), stampa il numero di occorrenze di ciascun valore.
  5. ...data una lista di valori interi, la ordina in senso decrescente.
  6. ...effettua il prodotto di due matrici.
  7. ...data una matrice di interi, verifica se è un quadrato magico, ovvero se la somma dei valori su ciascuna riga e colonna è lo stesso.
  8. ...data una rappresentazione di una scacchiera (8x8) tramite una matrice di char, in cui '-' indica una casa vuota e 'Q' una regina, determina se è una soluzione per il problema delle 8 regine. Si ricorda che il problema consiste nel collocare sulla scacchiera 8 regine in modo che nessuna sia minacciata da un'altra, ovvero che nessuna si trovi sulla stessa riga, colonna o diagonale di un'altra.
  9. ...data una lista di 5 supermercati, ciascuno con il proprio listino prezzi, e una lista della spesa (10 articoli), decide dove è più conveniente fare acquisti. Si ipotizzi un totale di 100 articoli venduti, rappresentati da un codice intero, ed il cui prezzo è rappresentato da un intero non negativo. Notare che alcuni negozi potrebbero non disporre di certi articoli.
  10. ...calcola la funzione fattoriale:
  11. ...stampa una lista di caratteri utilizzando una funzione ricorsiva che, data una lista di caratteri, stampa il primo carattere e poi invoca nuovamente se stessa sulla lista costituita dai successivi n-1 caratteri.
  12. ...data una rappresentazione di una stanza rettangolare contenente degli ostacoli (matrice n*m di int, in cui 0 rappresenta uno spazio vuoto, e 1 rappresenta un ostacolo), stampa un percorso possibile per raggiungere un angolo della stanza a partire da quello opposto. Si suggerisce di utilizzare una funzione ricorsiva.
  13. ...dato l'albero binario(1) di interi rappresentato(2) di seguito:
    int[] albero={0,1,5,2,4,-1,6,3,-1,-1,-1, -1,-1,7,8};
    ne stampa il contenuto effettuando una visita in profondità(3).
  14. ...data una lista di valori interi, costruisce un albero binario di ricerca(4) contenente tali valori.

    (1) Si ricorda che un albero binario è una struttura dati che può essere definita ricorsivamente come segue: "Un albero binario è costituito da un nodo, detto radice, e da due sottoalberi destro e sinistro, che sono a loro volta alberi binari. Ad ogni nodo è associato un valore."

    (2) Si ricorda che un albero binario di profondità massima k può essere rappresentato tramite un array di dimensione (2^k)-1, in cui l'elemento di indice 0 rappresenta la radice dell'albero, i figli sinistro e destro del nodo di indice i hanno indice rispettivamente 2i e 2i+1, e la mancanza di un nodo si rappresenta con un valore speciale (ad es -1 se i nodi contengono interi).

    (3) Si ricorda che nella visita in profondità (in preordine) di un albero binario si procede stampando la radice e poi visitando in profondità prima il sottoalbero sinistro e poi il sottoalbero destro.

    (4) Si ricorda che un albero binario di ricerca è un'albero binario in cui il valore di un nodo è maggiore o uguale del valore di ciascun nodo contenuto nel suo sottoalbero sinistro, e minore o uguale del valore di ciascun nodo del suo sottoalbero destro.